package com.davidlife.javaee.xml.jsoup;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.File;
import java.io.IOException;
import java.net.URL;

/*
#### 解析XML
* 操作xml文档，将文档中的数据读取到内存中
	1. 解析(读取)：将文档中的数据读取到内存中
	2. 写入：将内存中的数据保存到xml文档中。持久化的存储
* 解析xml的方式：
	1. DOM：将标记语言文档一次性加载进内存，在内存中形成一颗dom树
		* 优点：操作方便，可以对文档进行CRUD的所有操作
		* 缺点：占内存
		* （在服务端一般使用DOM的思想）
	2. SAX：逐行读取，基于事件驱动的。
		* 优点：不占内存。（适用于内存较小的设备，比如现在手机等移动设备都使用的是SAX思想。）
		* 缺点：只能读取，不能增删改
		* （在客户端（比如Android等）一般使用SAX的思想。）
* xml常见的解析器：
	1. JAXP：sun公司提供的解析器，支持dom和sax两种思想（性能差，代码写起来复杂，基本没人使用这个）
	2. DOM4J：一款非常优秀的解析器（只支持DOM，用的较多）
	3. Jsoup：jsoup 是一款Java 的HTML解析器，可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API，可通过DOM，CSS以及类似于jQuery的操作方法来取出和操作数据。（也可以解析XML）
	4. PULL：Android操作系统内置的解析器，sax方式的。
* Jsoup：jsoup 是一款Java 的HTML解析器，可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API，可通过DOM，CSS以及类似于jQuery的操作方法来取出和操作数据。
	* 快速入门：
		* 步骤：
			1. 导入jar包（这里使用的jsoup-1.11.2.jar）
			2. 获取Document对象
			3. 获取对应的标签Element对象
			4. 获取数据
    	* 代码：(如下)
    	* 对象的使用：
            1. Jsoup：工具类，可以解析html或xml文档，返回Document
                * parse：解析html或xml文档，返回Document
                    * `parse(File in, String charsetName)`：解析xml或html文件
                    * `parse(String html)`：解析xml或html字符串
                    * `parse(URL url, int timeoutMillis)`：通过网络路径获取指定的html或xml的文档对象(可以用这个做爬虫程序等)
                    ```
                    URL url = new URL("https://www.baidu.com/");
                    Document document = Jsoup.parse(url, 1000);
                    System.out.println(document);
                    ```
            2. Document：文档对象。代表内存中的dom树
                * 获取Element对象
                    * `getElementById(String id)`：根据id属性值获取唯一的element对象
                    * `getElementsByTag(String tagName)`：根据标签名称获取元素对象集合
                    * `getElementsByAttribute(String key)`：根据属性名称获取元素对象集合
                    * `getElementsByAttributeValue(String key, String value)`：根据对应的属性名和属性值获取元素对象集合
            3. Elements：元素Element对象的集合。可以当做 `ArrayList<Element>`来使用
            4. Element：元素对象
                1. **获取子元素**对象
                    * `getElementById(String id)`：根据id属性值获取唯一的element对象
                    * `getElementsByTag(String tagName)`：根据标签名称获取元素对象集合
                    * `getElementsByAttribute(String key)`：根据属性名称获取元素对象集合
                    * `getElementsByAttributeValue(String key, String value)`：根据对应的属性名和属性值获取元素对象集合
                2. 获取属性值
                    * `String attr(String key)`：根据属性名称获取属性值(这里属性名是不区分大小写的)
                3. 获取文本内容
                    * `String text()`:获取文本内容
                    * `String html()`:获取标签体的所有内容(包括子标签的标签和文本内容)
            5. Node：节点对象
                * 是Document和Element的父类
 */
public class XmlJsoupDemo {
    public static void main(String[] args) throws IOException {
        //2.1获取student.xml的path
        String path = XmlJsoupDemo.class.getClassLoader().getResource("student.xml").getPath();
        //2.2解析xml文档，加载文档进内存，获取dom树--->Document
        Document document = Jsoup.parse(new File(path), "utf-8");
        //3.获取元素对象 Element
        Elements elements = document.getElementsByTag("name");

        System.out.println(elements.size());
        //3.1获取第一个name的Element对象
        Element element = elements.get(0);
        //3.2获取数据
        String name = element.text();
        System.out.println(name);

        System.out.println("-------------");
        String html = element.html();
        System.out.println(html);
        System.out.println("-------------");
        String outerHtml = element.outerHtml();
        System.out.println(outerHtml);

        System.out.println("=====================");

        URL url = new URL("https://www.baidu.com/");
        Document document1 = Jsoup.parse(url, 1000);
        System.out.println(document1);
    }
}
